package leetcode每日一题;


import javax.security.auth.login.CredentialNotFoundException;
import java.util.Arrays;

/**
 * 1. 问题描述
 *      给你一个用字符数组tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。
 *      任务可以以任意顺序执行，并且每个任务都可以在 1 个单位时间内执行完。
 *      在任何一个单位时间，CPU 可以完成一个任务，或者处于待命状态。
 *      然而，两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间，
 *      因此至少有连续 n 个单位时间内 CPU 在执行不同的任务，或者在待命状态。
 *      你需要计算完成所有任务所需要的 最短时间 。

 * 2. 算法分析
 *
 *      详细分析看leetcode 621 官方给了两种方式，这是其中一种
 *      大致思想就是：
 *          每次将最多的任务找出来，用其他的任务来填满任务之间的间隔(本质上是一种贪心的算法)
 *          此题的详细证明在leetcode官方解答中有，非常详细，但是内容比较不太好懂
 *
 * 3. 代码实现
 */
@SuppressWarnings("all")
public class 任务调度器621 {
    public static void main(String[] args) {

    }

    public static int leastInterval(char[] tasks, int n) {
        int[] taskCounts = new int[26];
        for (char task : tasks) {
            taskCounts[task - 'A']++;
        }
        int maxSeq = taskCounts[25];
        int maxCount = 1;
        for (int i = 25; i >= 1; i++) {
            if (taskCounts[i] == taskCounts[i-1]) {maxCount++;}
            break;
        }
        return Math.max(tasks.length,(maxSeq-1)*(n+1) + maxCount);
    }


}

